package com.apes.enquiry.product.service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.apes.enquiry.product.model.SpProduct;
import org.apache.commons.lang3.StringUtils;

import java.util.*;
import java.util.regex.Pattern;

/**
 * @className: com.apes.enquiry.product.service.ProductUtil
 * @description: 描述
 * @author: wsl
 * @create: 2022-11-14 15:56
 */
public class UploadingProductUtil {

    /**
     * 批量校验数据是否为空
     *
     * @param objs
     * @return
     */
    public static boolean isAllNotEmpty(Object... objs) {
        if (objs.length == 0) {
            return false;
        }
        for (Object obj : objs) {
            if (Objects.isNull(obj) || "".equals(obj)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 全车件商品上传失败信息
     * @param array 失败数据
     * @param allName 品牌列表
     * @param autoBrand 车品牌列表
     * @param quality 品牌+品质组成map
     * @param categories 标准名称列表
     * @param PNAndBrand 零件号+品牌组成的set
     * @return
     */
    public static JSONObject wholeCause(JSONArray array, List<String> allName, List<String> autoBrand,
                                        Map<String, String> quality, List<String> categories, Set PNAndBrand,String supplier) {
        JSONObject notProduct = new JSONObject();
        StringBuilder cause = new StringBuilder();
        //0、零件号 1、品牌 2、标准名称 3、车品牌 4、商品名称 5、商家编码 6、产品描述 7、库存数量 8、不含税单价 9、上架状态 10、产地 11、质保期
        for (int i = 0; i < array.size(); i++) {
            switch (i) {
                case 0: {
                    if (Objects.isNull(array.getString(i))) cause.append("零件号为空;");
                    notProduct.put("PN", array.getString(i));
                    break;
                }
                case 1: {
                    if (Objects.isNull(array.getString(i)) || !allName.contains(array.getString(i)))
                        cause.append("品牌请填写品牌清单内的具体品牌;");
                    if (!PNAndBrand.add(array.getString(0) + array.getString(i) + supplier)) cause.append("同品牌下，零件号不可重复;");
                    notProduct.put("brand", array.getString(i));
                    break;
                }
                case 2: {
                    if (Objects.isNull(array.getString(i))){
                        notProduct.put("category", array.getString(i));
                        break;
                    }
                    if (!categories.contains(array.getString(i))) {
                        cause.append("请填写标准名称清单中的标准名称;");
                    }
                    notProduct.put("category", array.getString(i));
                    break;
                }
                case 3: {
                    String brand = Objects.isNull(quality.get(array.getString(i))) ? "" : quality.get(array.getString(i));
                    if ("原厂(4S店)件、原厂件、再制造件".contains(brand)) {
                        if (Objects.isNull(array.getString(i))) cause.append("原厂件类【原厂(4S店)件、原厂件、再制造件】请填写车品牌;");
                        if (Objects.nonNull(array.getString(i)) && !autoBrand.contains(array.getString(i))) cause.append("车品牌请填写车品牌清单内的车品牌;");
                    }
                    notProduct.put("automobile", array.getString(i));
                    break;
                }
                case 4: {
                    if (Objects.isNull(array.getString(i))) cause.append("商品名称为空;");
                    notProduct.put("name", array.getString(i));
                    break;
                }
                case 5: {
                    notProduct.put("merchant_product", array.getString(i));
                    break;
                }
                case 6: {
                    notProduct.put("describe", array.getString(i));
                    break;
                }
                case 7: {
                    notProduct.put("merchantStockQty", array.getString(i));
                    break;
                }
                case 8: {
                    notProduct.put("notTaxUnitPrice", array.getString(i));
                    break;
                }
                case 9: {
                    notProduct.put("putawayState", array.getString(i));
                    break;
                }
                case 10: {
                    notProduct.put("placeOfOrigin", array.getString(i));
                    break;
                }
                case 11: {
                    if (Objects.isNull(array.getString(i))) cause.append("质保期不能为空;");
                    if (!Objects.isNull(array.getString(i))&&!array.getString(i).equals("0")&&!array.getString(i).equals("1")&&!array.getString(i).equals("3")&&
                        !array.getString(i).equals("6")&&!array.getString(i).equals("12")&&!array.getString(i).equals("24")) cause.append("质保期必须是0、1、3、6、12、24");
                    notProduct.put("guaranteePeriod", array.getString(i));
                    break;
                }

            }
        }
        notProduct.put("cause", cause.toString());
        return notProduct;
    }

    /**
     * 机油类商品上传失败信息
     *
     * @param array   一条Excel数据
     * @param allName 品牌列表
     * @param PNAndBrand 零件号+品牌列表
     * @return
     */
    public static JSONObject oilyCause(JSONArray array, List<String> allName, Set PNAndBrand, String supplier) {
        JSONObject notProduct = new JSONObject();
        StringBuilder cause = new StringBuilder();
        //0、零件号 1、品牌 2、商品名称 3、商家编码 4、系列 5、型号 6、容量 7、API等级 8、粘度等级 9、类型 10、机油类型 11、产品描述 12、库存数量 13、不含税单价 14、上架状态
        for (int i = 0; i < array.size(); i++) {
            switch (i) {
                case 0: {
                    if (Objects.isNull(array.getString(i))) cause.append("零件号为空;");
                    notProduct.put("PN", array.getString(i));
                    break;
                }
                case 1: {
                    if (Objects.isNull(array.getString(i)) || !allName.contains(array.getString(i)))
                        cause.append("品牌请填写品牌清单内的具体品牌;");
                    if (!PNAndBrand.add(array.getString(0) + array.getString(i) + supplier)) cause.append("同品牌下，零件号不可重复;");
                    notProduct.put("brand", array.getString(i));
                    break;
                }
                case 2: {
                    if (Objects.isNull(array.getString(i))) cause.append("商品名称为空;");
                    notProduct.put("name", array.getString(i));
                    break;
                }
                case 3: {
                    notProduct.put("merchantProduct", array.getString(i));
                    break;
                }
                case 4: {
                    if (Objects.isNull(array.getString(i))) cause.append("系列为空;");
                    notProduct.put("catena", array.getString(i));
                    break;
                }
                case 5: {
                    notProduct.put("model", array.getString(i));
                    break;
                }
                case 6: {
                    if (Objects.isNull(array.getString(i)) || !Pattern.matches("^\\d+(\\.\\d+)?$", array.getString(i)))
                        cause.append("容量[L]请填写数值;");
                    notProduct.put("capacity", array.getString(i));
                    break;
                }
                case 7: {
                    if (Objects.isNull(array.getString(i))) cause.append("API等级为空;");
                    notProduct.put("apiClass", array.getString(i));
                    break;
                }
                case 8: {
                    if (Objects.isNull(array.getString(i))) cause.append("粘度等级为空;");
                    notProduct.put("viscosityClass", array.getString(i));
                    break;
                }
                case 9: {
                    if (Objects.isNull(array.getString(i)) || !"汽机油、柴机油、柴汽通用机油".contains(array.getString(i)))
                        cause.append("类型请填写汽机油、柴机油、柴汽通用机油;");
                    notProduct.put("type", array.getString(i));
                    break;
                }
                case 10: {
                    if (Objects.isNull(array.getString(i)) || !"矿物油、半合成机油、全合成机油".contains(array.getString(i)))
                        cause.append("机油类型请填写矿物油、半合成机油、全合成机油;");
                    notProduct.put("engineOilType", array.getString(i));
                    break;
                }
                case 11: {
                    notProduct.put("describe", array.getString(i));
                    break;
                }
                case 12: {
                    notProduct.put("merchantStockQty", array.getString(i));
                    break;
                }
                case 13: {
                    notProduct.put("notTaxUnitPrice", array.getString(i));
                    break;
                }
                case 14: {
                    notProduct.put("putawayState", array.getString(i));
                    break;
                }
                case 15: {
                    notProduct.put("placeOfOrigin", array.getString(i));
                    break;
                }
                case 16: {
                    if (Objects.isNull(array.getString(i))) cause.append("质保期不能为空;");
                    if (!Objects.isNull(array.getString(i))&&!array.getString(i).equals("0")&&!array.getString(i).equals("1")&&!array.getString(i).equals("3")&&
                            !array.getString(i).equals("6")&&!array.getString(i).equals("12")&&!array.getString(i).equals("24")) cause.append("质保期必须是0、1、3、6、12、24");
                    notProduct.put("guaranteePeriod", array.getString(i));
                    break;
                }
            }
        }
        notProduct.put("cause", cause.toString());
        return notProduct;
    }

    /**
     * 蓄电池类商品上传失败信息
     *
     * @param array   一条Excel数据
     * @param allName 品牌列表
     * @return
     */
    public static JSONObject accumulatorCause(JSONArray array, List<String> allName, Set PNAndBrand, String supplier) {
        JSONObject notProduct = new JSONObject();
        StringBuilder cause = new StringBuilder();
        //0、零件号 1、品牌 2、商品名称 3、商家编码 4、国际标号 5、参考号 6、类型 7、系列 8、额定容量 9、额定电压 10、尺寸 11、端子 12、冷启动电流 13、产品描述 14、库存数量 15、不含税单价 16、上架状态
        for (int i = 0; i < array.size(); i++) {
            switch (i) {
                case 0: {
                    if (Objects.isNull(array.getString(i))) cause.append("零件号为空;");
                    notProduct.put("PN", array.getString(i));
                    break;
                }
                case 1: {
                    if (Objects.isNull(array.getString(i)) || !allName.contains(array.getString(i)))
                        cause.append("品牌请填写品牌清单内的具体品牌;");
                    if (!PNAndBrand.add(array.getString(0) + array.getString(i) + supplier)) cause.append("同品牌下，零件号不可重复;");
                    notProduct.put("brand", array.getString(i));
                    break;
                }
                case 2: {
                    if (Objects.isNull(array.getString(i))) cause.append("商品名称为空;");
                    notProduct.put("name", array.getString(i));
                    break;
                }
                case 3: {
                    notProduct.put("merchantProduct", array.getString(i));
                    break;
                }
                case 4: {
                    if (Objects.isNull(array.getString(i))) cause.append("国际标号为空;");
                    notProduct.put("international", array.getString(i));
                    break;
                }
                case 5: {
                    if (Objects.isNull(array.getString(i))) cause.append("参考号为空;");
                    notProduct.put("reference", array.getString(i));
                    break;
                }
                case 6: {
                    if (Objects.isNull(array.getString(i)) || !"免维护蓄电池，AGM启停蓄电池，EFB启停蓄电池".contains(array.getString(i)))
                        cause.append("类型请填写免维护蓄电池、AGM启停蓄电池、EFB启停蓄电池;");
                    notProduct.put("type", array.getString(i));
                    break;
                }
                case 7: {
                    if (Objects.isNull(array.getString(i))) cause.append("系列为空;");
                    notProduct.put("series", array.getString(i));
                    break;
                }
                case 8: {
                    if (Objects.isNull(array.getString(i)) || !Pattern.matches("^\\d+(\\.\\d+)?$", array.getString(i)))
                        cause.append("额定容量[Ah]请填写数值;");
                    notProduct.put("capacity", array.getString(i));
                    break;
                }
                case 9: {
                    if (Objects.isNull(array.getString(i)) || !Pattern.matches("^\\d+(\\.\\d+)?$", array.getString(i)))
                        cause.append("额定电压[V]请填写数值;");
                    notProduct.put("voltage", array.getString(i));
                    break;
                }
                case 10: {
                    if (Objects.isNull(array.getString(i)) || !Pattern.matches("^(\\d+)\\*(\\d+)\\*(\\d+)$", array.getString(i)))
                        cause.append("尺寸[mm]请按长*宽*高填写数值，例如278*175*190;");
                    notProduct.put("sizes", array.getString(i));
                    break;
                }
                case 11: {
                    if (Objects.isNull(array.getString(i)) || !"正装，反装".contains(array.getString(i)))
                        cause.append("端子请填写：正装、反装;");
                    notProduct.put("terminal", array.getString(i));
                    break;
                }
                case 12: {
                    if(Objects.isNull(array.getString(i))){
                        notProduct.put("electricity", array.getString(i));
                        break;
                    }
                    if (!Objects.isNull(array.getString(i)) && !Pattern.matches("^\\d+(\\.\\d+)?$", array.getString(i)))
                        cause.append("冷启动电流CCA[A]请填写数值;");
                    notProduct.put("electricity", array.getString(i));
                    break;
                }
                case 13: {
                    notProduct.put("describe", array.getString(i));
                    break;
                }
                case 14: {
                    notProduct.put("merchantStockQty", array.getString(i));
                    break;
                }
                case 15: {
                    notProduct.put("notTaxUnitPrice", array.getString(i));
                    break;
                }
                case 16: {
                    notProduct.put("putawayState", array.getString(i));
                    break;
                }
                case 17: {
                    notProduct.put("placeOfOrigin", array.getString(i));
                    break;
                }
                case 18: {
                    if (!Objects.isNull(array.getString(i))&&!array.getString(i).equals("0")&&!array.getString(i).equals("1")&&!array.getString(i).equals("3")&&
                            !array.getString(i).equals("6")&&!array.getString(i).equals("12")&&!array.getString(i).equals("24")) cause.append("质保期必须是0、1、3、6、12、24");
                    notProduct.put("guaranteePeriod", array.getString(i));
                    break;
                }
            }
        }
        notProduct.put("cause", cause.toString());
        return notProduct;
    }

    /**
     * 轮胎类商品上传失败信息
     *
     * @param array   一条Excel数据
     * @param allName 品牌列表
     * @return
     */
    public static JSONObject tyreCause(JSONArray array, List<String> allName, Set PNAndBrand, String supplier) {
        JSONObject notProduct = new JSONObject();
        StringBuilder cause = new StringBuilder();
        //0、零件号 1、品牌 2、商品名称 3、商家编码 4、规格 5、花纹 6、载重指数 7、速度等级 8、是否防爆 9、产品描述 10、库存数量 11、不含税单价 12、上架状态
        for (int i = 0; i < array.size(); i++) {
            switch (i) {
                case 0: {
                    if (Objects.isNull(array.getString(i))) cause.append("零件号为空;");
                    notProduct.put("PN", array.getString(i));
                    break;
                }
                case 1: {
                    if (Objects.isNull(array.getString(i)) || !allName.contains(array.getString(i)))
                        cause.append("品牌请填写品牌清单内的具体品牌;");
                    if (!PNAndBrand.add(array.getString(0) + array.getString(i) + supplier)) cause.append("同品牌下，零件号不可重复;");
                    notProduct.put("brand", array.getString(i));
                    break;
                }
                case 2: {
                    if (Objects.isNull(array.getString(i))) cause.append("商品名称为空;");
                    notProduct.put("name", array.getString(i));
                    break;
                }
                case 3: {
                    notProduct.put("merchantProduct", array.getString(i));
                    break;
                }
                case 4: {
                    if (Objects.isNull(array.getString(i))) cause.append("规格为空;");
                    notProduct.put("specification", array.getString(i));
                    break;
                }
                case 5: {
                    if (Objects.isNull(array.getString(i))) cause.append("花纹为空;");
                    notProduct.put("figure", array.getString(i));
                    break;
                }
                case 6: {
                    if (Objects.isNull(array.getString(i))) cause.append("载重指数为空;");
                    notProduct.put("loadIndex", array.getString(i));
                    break;
                }
                case 7: {
                    if (Objects.isNull(array.getString(i))) cause.append("速度等级为空;");
                    notProduct.put("speedClass", array.getString(i));
                    break;
                }
                case 8: {
                    if (Objects.isNull(array.getString(i)) || !"是，否".contains(array.getString(i)))
                        cause.append("是否防爆请填写“是”或“否”;");
                    notProduct.put("antiExplosion", array.getString(i));
                    break;
                }
                case 9: {
                    notProduct.put("describe", array.getString(i));
                    break;
                }
                case 10: {
                    notProduct.put("merchantStockQty", array.getString(i));
                    break;
                }
                case 11: {
                    notProduct.put("notTaxUnitPrice", array.getString(i));
                    break;
                }
                case 12: {
                    notProduct.put("putawayState", array.getString(i));
                    break;
                }
                case 13: {
                        notProduct.put("placeOfOrigin", array.getString(i));
                        break;
                }
                case 14: {
                    if (!Objects.isNull(array.getString(i))&&!array.getString(i).equals("0")&&!array.getString(i).equals("1")&&!array.getString(i).equals("3")&&
                            !array.getString(i).equals("6")&&!array.getString(i).equals("12")&&!array.getString(i).equals("24")) cause.append("质保期必须是0、1、3、6、12、24");
                    notProduct.put("guaranteePeriod", array.getString(i));
                    break;
                }
            }
        }
        notProduct.put("cause", cause.toString());
        return notProduct;
    }


    /**
     * 批量更新库存价格失败信息
     *
     * @param array     一条Excel数据
     * @param spProduct 商品
     * @return
     */
    public static JSONObject StockCause(JSONArray array, SpProduct spProduct) {
        JSONObject notProduct = new JSONObject();
        StringBuilder cause = new StringBuilder();
        //0、零件号 1、品牌  2、库存数量 3、不含税单价
        for (int i = 0; i < array.size(); i++) {
            switch (i) {
                case 0: {
                    if (Objects.isNull(array.getString(i))) cause.append("零件号为空;");
                    notProduct.put("PN", array.getString(i));
                    break;
                }
                case 1: {
                    if (Objects.isNull(array.getString(i)) || Objects.isNull(spProduct)) cause.append("未找到该商品，商品不存在;");
                    notProduct.put("spBrand", array.getString(i));
                    break;
                }
                case 2: {
                    if (Objects.isNull(array.getString(i))) cause.append("商品名称为空;");
                    notProduct.put("name", array.getString(i));
                    break;
                }
                case 3: {
                    if (Objects.isNull(array.getString(i)) || !Pattern.matches("[0-9]*", array.getString(i)))
                        cause.append("库存数量请输入8位以内的非负整数;");
                    notProduct.put("merchantStockQty", array.getString(i));
                    break;
                }
                case 4: {
                    if (Objects.isNull(array.getString(i)) || !Pattern.matches("^\\d+(\\.\\d+)?$", array.getString(i)))
                        cause.append("不含税单价请填写非负两位小数;");
                    notProduct.put("notTaxUnitPrice", array.getString(i));
                    break;
                }
            }
        }
        notProduct.put("cause", cause.toString());
        return notProduct;
    }
}
